/*
 * @Description: 
 * @Author: rendc
 * @Date: 2025-10-23 09:06:31
 * @LastEditors: rendc
 * @LastEditTime: 2025-10-23 10:29:11
 */
var a = 1;
var a1 = 100;
(function () {
  var a = 10;
  console.log('🤡 CC - a:', a);
  console.log('🤡 CC - a1:', a1);
})()
// console.log('🤡 CC - a:', a);
console.log('🤡 CC - a1:', a1);

function foo1 () {
  var m2 = n2 = 300;
  function sum (m, n) {
    // 函数作用域
    var m1 = 10;
    console.log('🤡 CC - sum - m1:', m1);
    var n1 = 20;
    console.log('🤡 CC - sum - n1:', n1);
    console.log('🤡 CC - sum - m2:', m2);
    console.log('🤡 CC - sum - n2:', n2);
    console.log('🤡 CC - sum - m:', m);
    console.log('🤡 CC - sum - n:', n);
  }
  sum(5, 6);
}

// console.log('🤡 CC - sum - out - m1:', m1);
// console.log('🤡 CC - sum - out - n1:', n1);
function foo () {
  var a // 变量声明提升
  console.log('🤡 CC - foo - a:', a); // undefined
  // var a = 100;
  console.log('🤡 CC - foo - a:', a); // 100
  function inner () {
    // 函数内部有变量a 就会产生局部作用域 外界的a不会对内部造成影响
    console.log('🤡 CC - inner - a:', a); //  undefined
    // var a = 200;
    // 【就近原则】
    // 只有当函数内部作用域没a的时候 才会找外部作用域
    console.log('🤡 CC - inner - a:', a); // 200
  }
  inner();
}
foo();

var a = 100;
function fu () {
  var b = 200;
  // 这里的a就是一个自由变量
  console.log('🤡 CC - fu - a:', a); // 100
  console.log('🤡 CC - fu - b:', b); // 200
}
fu();

console.log("=======================");
var a = 10;
function fn () {
  var b = 20;
  // console.log('🤡 CC - b :', b); // ?20
  function fnInner () {
    // 10 + 20
    console.log('🤡 CC - fnInner - a+b:', a + b);
  }
  return fnInner;
}
var x = fn();
// console.log('🤡 CC - b :', b); // undefined
// x = fnInner; // b = 20;
// console.log('🤡 CC - x :', x);// ?[Function: fnInner]
b = 200;
console.log('🤡 CC - b :', b); // 200
x(); // 30

// for (var i = 0; i < 3; i++) {
//   console.log('🤡 CC - i:', i);
//   // 延时执行函数
//   setTimeout(() => {
//     console.log("-");
//   }, 1000);
// }


// for (var i = 0; i < 3; i++) {
//   // 延时执行函数
//   setTimeout(
//     function () {
//       // i ?
//       console.log('🤡 CC - i:', i);
//     }, 1000);
//   // console.log('🤡 CC - i:', i);
// }
// 1 i=0 i++ 1
// 2 i=1 i++ 2
// 3 i=2 i++ 3
// 4 i=3 
// 1. setTimeout 是异步执行的，等同步代码执行完再执行
// 2. 闭包 setTimeout 引用的 i 是自由变量 等到他执行的时候 i=3 

for (var i = 0; i < 3; i++) {
  // 立即执行函数
  (function (j) {
    setTimeout(
      function () {
        // i ?
        console.log('🤡 CC - j:', j);
      }, 1000);
  })(i);
  // console.log('🤡 CC - i:', i);
}
// 1 i=0 
// 立即执行函数创建了新的作用域 j = 0
// i++ 1 

// 2 i=1
// 立即执行函数创建了新的作用域 j = 1
//  i++ 2

// 3 i=2 
// 立即执行函数创建了新的作用域 j = 2
// i++ 3

// 4 i=3 